/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package grafo;
import java.util.ArrayList;  

/**
 *
 * @author Paloma
 */
    
      
      
   public class Grafo {  
  
    private static ArrayList arestas;  
    private static ArrayList<Vertice> vertices;  
    private int [][]matrizAdjacencia;  
    private int [][] matrizIncidencia;  
    private int [][] matrizD;
    private int [][] matrizLaplace;
      
  
  
  
//  Cria um grafo usando matriz de adjacencia  
    public Grafo(){  
        vertices = new ArrayList<Vertice>();  
        arestas = new ArrayList();  
                 }  
  
  
  
    public Vertice addVertice(Vertice v){  
        v.nome=this.getNovoNome();
        vertices.add(v);  
         return(v);  
    }  
  
  
     public  Aresta addAresta(Vertice _v1, Vertice _v2){  
        if(this.getArestaEntreVertices(_v1,_v2)==null){  
            Aresta aresta = new Aresta(_v1,_v2);  
            arestas.add(aresta);  
            this.updateMatrizAdjacencias();  
            this.updateMatrizIncidencias();  
            return(aresta);  
            
        }  
        return(null);  
    }   
  
   
  
    public  Vertice getVertice(int i){  
        return((Vertice)vertices.get(i));  
    }  
    
    public synchronized  Aresta getAresta(int i){  
        return((Aresta)arestas.get(i));  
    }  
    
    public Aresta getArestaEntreVertices(Vertice _v1, Vertice _v2){  
        Aresta aresta;  
        for(int i=0;i<arestas.size();i++){  
            aresta = this.getAresta(i);  
            if(aresta.contemAresta(_v1,_v2))   
                return(aresta);  
        }  
        return(null);  
    }
    
    
  
    public ArrayList getAdjacencias(Vertice v){  
        Aresta aresta;  
        ArrayList adjacencias = new ArrayList();  
        for(int i=0;i<arestas.size();i++){  
            aresta = this.getAresta(i);  
            if(aresta.getvorigem() == v){  
                adjacencias.add(aresta.getvdestino()); 
                //System.out.println("get Adjacencias destino"+ aresta.getRotulo());
            }  
            if(aresta.getvdestino() == v){  
                adjacencias.add(aresta.getvorigem());
                //System.out.println("get Adjacencias origem "+ aresta.getRotulo());
            }  
        }  
       
        return(adjacencias);  
    }  
  
   
   
  
      
    public synchronized int getQtdVertices(){  
        return(vertices.size());  
    } 
    
    public synchronized int getQtdArestas(){  
        return(arestas.size());  
    }
    
    
       public  void updateMatrizAdjacencias(){  
        Vertice vertice;  
        Vertice verticeAux;  
        ArrayList v_adjacencias;  
        matrizAdjacencia = new int[vertices.size()][vertices.size()];  
  
  
        for(int i=0;i<vertices.size();i++){  
            vertice = this.getVertice(i);  
            v_adjacencias = this.getAdjacencias(vertice);  
            for(int j=0;j<v_adjacencias.size();j++){  
                verticeAux = (Vertice)v_adjacencias.get(j);  
                matrizAdjacencia[i][verticeAux.nome-1] = 1;  
            }  
        }  
    }  
    private  void updateMatrizIncidencias(){  
        Aresta aresta;  
        matrizIncidencia = new int[vertices.size()][arestas.size()];  
  
        for(int j=0;j<arestas.size();j++){  
            aresta = this.getAresta(j);  
            matrizIncidencia[aresta.getvorigem().nome-1][j] = 1;  
            matrizIncidencia[aresta.getvdestino().nome-1][j] = 1;  
        }  
    } 
    
    
    private int getNovoNome(){  
        return(vertices.size()+1);  
    } 
    
    public void criarMatrizD(){
        matrizD = new int [vertices.size()][vertices.size()];
        int grau=0;
        for(int i=0;i<vertices.size();i++){
            for(int j=0;j<vertices.size();j++){
                 grau += matrizAdjacencia[j][i];
            }
          matrizD[i][i] = grau;  
          grau=0;
        }
    }
    
    public void criarMatrizLaplace(){
       matrizLaplace= new int [vertices.size()][vertices.size()];
       for (int i =0;i<vertices.size();i++){
           for(int j =0;j<vertices.size();j++){
               matrizLaplace [i][j] = matrizD[i][j] - matrizAdjacencia[i][j];
           }       
       }
                   
    }
    
  
    public String imprimeMatrizAdjacencia(Grafo grafo){
     String saida = "";
        for(int i = 0; i < vertices.size(); i++)   {
            for(int j = 0; j < matrizAdjacencia[i].length; j++)    {  
                saida = saida + matrizAdjacencia[i][j] + " ";
                System.out.print(matrizAdjacencia[i][j]);
            }
            saida = saida + "\n";
            System.out.println("");  
        }

     return saida;
    } 
    
    public String imprimeMatrizIncidencia(Grafo grafo){
     String saida = "";
     for(int i = 0; i < vertices.size(); i++)   {  
            for(int j = 0; j < matrizIncidencia[i].length; j++)    {
                saida = saida + matrizIncidencia[i][j] + " ";
                System.out.print(matrizIncidencia[i][j]);  
            }
            saida = saida + "\n";
            System.out.println("");  
        }

     return saida;
    }
    
    public String imprimeMatrizD(){
      String saida = "";
      for (int i =0;i<vertices.size();i++){
          for(int j=0;j<matrizD[i].length;j++){
              System.out.print(matrizD[i][j]);
              saida = saida + matrizD[i][j] + " ";
          }
          saida = saida + "\n";
          System.out.println("");  
      }
      return saida;
    }
    
    public String imprimeMatrizLaplace(){
        String saida = "";
         for (int i =0;i<vertices.size();i++){
          for(int j=0;j<matrizLaplace[i].length;j++){
              saida = saida + matrizLaplace[i][j]+ " ";
              System.out.print(matrizLaplace[i][j] + " "); 
          }
          saida = saida + "\n";
          System.out.println("");  
      }
        return saida;
    }
       
    public void imprimeListaVertices(){
     for (int i =0;i<vertices.size();i++){
        System.out.println("Esse e o vertice " + vertices.get(i).toString());
     }
    }
    
    public void imprimeListaArestas(){
     for (int i =0;i<arestas.size();i++){
        System.out.println("Esse e a aresta " + arestas.get(i).toString());
     }
    }
    
    public int [][] getMatrizLaplace(){
             return matrizLaplace;
    }
    
    public Vertice existeVertice(ArrayList<Vertice> vertices,String rotulo){
        Vertice aux=null;
        for (int i =0;i<vertices.size();i++){
           if (vertices.get(i).getRotulo().equals(rotulo)) {
             aux= vertices.get(i);
           } 
        }
        return aux;
    }
    
}
  

